package com.gtp.mq.demo.spring.consumer;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import com.rabbitmq.client.Channel;

/**
 * 手动ack
 */
@Component
@RabbitListener(queues="Topic_queue2")
public class MyAckConsumer{

	/**
	 * 处理方法，得和消息匹配(消息建议全局json)
	 * @param msg
	 * @param message
	 * @param channel
	 * @throws Exception
	 */
	@RabbitHandler //注解方式
	public void onMessage(String msg,Message message, Channel channel) throws Exception {

		System.out.println(message);

		// 消息
		System.out.println("收到:" + new String(message.getBody()));
		
		//正常ACK
		channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
		
		//QA:多次确认会怎么样? 会抛出一个错误，但是消息还是正常处理
		//channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
		
		/*
		 * nack requeue 值为 true 表示该消息重新放回队列头(消息重试)，值为 false 表示放弃这条消息
		 * 如果没有其他接收者监控这个queue的话，要注意一直无限循环发送的危险 basicNack：可以一次拒绝N条消息
		 * channel.basicNack(deliveryTag,multiple, requeue);
		 * 
		 * long deliveryTag
		 * boolean multiple 是否一次拒绝多条
		 * boolean requeue  是否重回队列(重试)
		 */
		//重新尝试,但是请注意:死循环情况
		//channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
		
		//不回答会怎么样? 全局手动ack未打开的情况下，会自动确认！
	}
}
